package com.kele.ddl;

import com.kele.entity.DbModel;
import com.kele.entity.TableDetails;
import com.kele.test.Test01;
import org.junit.Test;

import java.sql.*;
import java.util.*;

public class CreateTable {

    //加载数据库配置文件
    private  static ResourceBundle bundle= PropertyResourceBundle.getBundle("db");
    //创建数据库连接对象
    private  static Connection conn;
    //创建预处理对象
    private  static PreparedStatement ps;

    static Scanner sc;
    static String tableName;
    static ResultSet resultSet;
    static Statement stmt;
    static  ResultSetMetaData metaData;

    private  static TableDetails tableDetails=new TableDetails();

    private  static List<String> list1=new ArrayList<>();
//    private  static List<String> list2=new ArrayList<>();
//    private  static List<String> list3=new ArrayList<>();

    //创建数据库信息存储对象
    private static DbModel dbModel=new DbModel();

    /**
     * 创建表
     * 创建字段
     * tableName:表名
     * tab_fields：字段名
     */
    public  static  void createTable(String tableName,String []tab_fields) {
        //获得连接
        conn=getConnection();
        //拼接sql
        String sql="CREATE TABLE "+tableName+"(id int auto_increment primary key not null";
        if (tab_fields!=null&&tab_fields.length>0){
            sql+=",";
            int length=tab_fields.length;
            for (int i = 0; i <length ; i++) {
                //循环添加字段
                sql+=tab_fields[i].trim()+" varchar(255)";
                //判断是不是最后一条
                if(i<length-1){
                    sql+=",";
                }
            }
        }
        //设置默认字符集
        sql+=")DEFAULT CHARSET=utf8;";
        System.out.println("创建的建表语句是 ："+sql);
        //创建预处理
        try {
            ps=conn.prepareStatement(sql);
            ps.executeUpdate(sql);
            ps.close();
            conn.close();
        } catch (SQLException e) {
            e.printStackTrace();
            System.out.println("建表失败："+e.getMessage());
        }


    }

    /**
     * 获取数据库连接的函数
     * @return
     */
    public static Connection getConnection() {
        Connection con = null;  //创建用于连接数据库的Connection对象
        try {
            Class.forName(bundle.getString("db.classname"));// 加载Mysql数据驱动
            con = DriverManager.getConnection(bundle.getString("db.url"), bundle.getString("db.username"), bundle.getString("db.password"));// 创建数据连接
//            System.out.println("数据库连接成功："+con.getSchema());
        } catch (Exception e) {
            System.out.println("数据库连接失败" + e.getMessage());
        }
        return con;  //返回所建立的数据库连接
    }

    /**
     * 获得表信息和字段信息
     *
     * @param:catalog 包含目录名称的 String。对此参数提供 Null 值指示无需使用目录名称。
     *        schema 包含架构名称模式的 String 值。对此参数提供 Null 值指示无需使用架构名称。
     *        tableName 包含表名称模式的 String。
     *        types 含有要包含的表类型的字符串数组。Null 指示应包含所有表类型。
     * "%" 表示匹配 0 个或多个字符的任何子字符串
     */
    public static  DbModel getDbDetails(String tableName) throws SQLException {
            //获得连接
            conn=getConnection();

            //获取我们连接到的数据库的结构、存储信息
            DatabaseMetaData metaData=conn.getMetaData();
            //创建结果集对象,获得表名
            ResultSet result=metaData.getTables(null,"%",tableName,new String[]{"TABLE"});
            //遍历,循环输出表名
            while (result.next()){
//                System.out.println(result.getString("TABLE_NAME"));

                String table_name = result.getString("TABLE_NAME");

//                list1.add(table_name);
//                dbModel.setTableName(list1);
                dbModel.setTableName(table_name);

            }
            //创建结果集对象获得字段列名
            ResultSet resultSet=metaData.getColumns(null,"%",tableName,null);
            while (resultSet.next()){
                String columnName=resultSet.getString("COLUMN_NAME");
                String columnType=resultSet.getString("TYPE_NAME");
                int dataSize=resultSet.getInt("COLUMN_SIZE");
                int digits=resultSet.getInt("DECIMAL_DIGITS");
                int nullable=resultSet.getInt("NULLABLE");

                dbModel.setColumnType(columnType);
                dbModel.setColumnName(columnName);
                dbModel.setDataSize(dataSize);
                dbModel.setDigits(digits);
                dbModel.setNullable(nullable);
               // System.out.println(columnName+" "+columnType+" "+dataSize+" "+digits+" "+nullable);

               // list1.add(columnName);
//                list3.add(columnType);
//                dbModel.setColumnName(list2);
//                dbModel.setColumnType(list3);

                list1.add(dbModel.getColumnName());
                System.out.println(dbModel);

            }

            return dbModel;
    }

    /**
     *将查询出来的字段名传给对应的实体对象
     */
    public static void setDetailsToEntity(){

    }

    public static void main(String[] args) throws SQLException {

        System.out.println("==================测试有没有连接成功===================");
        System.out.println(getConnection());

//        System.out.println("==================建表===================");
//        //添加表名
//        String tableName="testautoddl";
//        //表字段数组
//        String [] tab_fields={"name","password","sex"};
//        //调用创建表的方法
//        createTable(tableName,tab_fields);

        System.out.println("==================获取所有表信息===================");

//        System.out.println(dbModel.getTableName().size());

        System.out.println("========================请输入源表名=============================");
        Scanner sc=new Scanner(System.in);
        //添加表名
        String table_name=sc.next();
        tableDetails.setTableName(table_name);
        Test01 test01=new Test01();
        test01.getName(tableDetails.getTableName());
        getDbDetails(tableDetails.getTableName());
        //表字段数组
        String [] tab_fields = new String[list1.size()];
        for (int i=0;i<list1.size();i++){
            tab_fields[i]=list1.get(i);
        }

        for (String fields:tab_fields
             ) {
            System.out.println(fields);
        }


        System.out.println("==============================================");

//        for (int i = 0; i <dbModel.getTableName().size() ; i++) {
//            if (!dbModel.getTableName().get(i).equals(tableName)){
//                System.out.println("表已经存在了，不要重复创建");
//
//            }else {
//                System.out.println("==================建表===================");
//                //调用创建表的方法
//                createTable(tableName,tab_fields);
//            }
//        }

        //调用创建表的方法，创建目标表
        String [] newtab_fields = new String[tab_fields.length-1];
        for (int i=0;i<tab_fields.length-1;i++){
            newtab_fields[i]=tab_fields[i+1];
        }
        createTable("t_"+table_name,newtab_fields);

//        if (null==dbModel.getTableName()){
//            //调用创建表的方法
//            createTable(table_name,tab_fields);
//
//        }else {
//            System.out.println("表已经存在了，不要重复创建");
//        }



    }

    public static String   test() throws SQLException {
        System.out.println("==================测试有没有连接成功===================");
        System.out.println(getConnection());

//        System.out.println("==================建表===================");
//        //添加表名
//        String tableName="testautoddl";
//        //表字段数组
//        String [] tab_fields={"name","password","sex"};
//        //调用创建表的方法
//        createTable(tableName,tab_fields);

        System.out.println("==================获取所有表信息===================");

//        System.out.println(dbModel.getTableName().size());

        System.out.println("========================请输入源表名=============================");
        Scanner sc=new Scanner(System.in);
        //输入表名
        String table_name=sc.next();
        tableDetails.setTableName(table_name);

        getDbDetails(tableDetails.getTableName());
        //表字段数组
        String [] tab_fields = new String[list1.size()];
        for (int i=0;i<list1.size();i++){
            tab_fields[i]=list1.get(i);
        }

        for (String fields:tab_fields
        ) {
            System.out.println(fields);
        }


        System.out.println("==============================================");

//        for (int i = 0; i <dbModel.getTableName().size() ; i++) {
//            if (!dbModel.getTableName().get(i).equals(tableName)){
//                System.out.println("表已经存在了，不要重复创建");
//
//            }else {
//                System.out.println("==================建表===================");
//                //调用创建表的方法
//                createTable(tableName,tab_fields);
//            }
//        }

        //调用创建表的方法，创建目标表
        String [] newtab_fields = new String[tab_fields.length-1];
        for (int i=0;i<tab_fields.length-1;i++){
            newtab_fields[i]=tab_fields[i+1];
        }
        String newTableName="t_"+table_name;
        createTable(newTableName,newtab_fields);

//        if (null==dbModel.getTableName()){
//            //调用创建表的方法
//            createTable(table_name,tab_fields);
//
//        }else {
//            System.out.println("表已经存在了，不要重复创建");
//        }


        return table_name;

    }

    public static   List execute(String tableName) throws SQLException {
        conn= CreateTable.getConnection();
        String sql="select * from "+tableName;
        stmt = conn.createStatement();

        resultSet=stmt.executeQuery(sql);

        metaData=resultSet.getMetaData();
        int columnCount=metaData.getColumnCount();

        List<String> list = new ArrayList<>();
        Map<String,String> map=new HashMap<>(16);
        while (resultSet.next()){
            for (int i = 1; i <=columnCount ; i++) {
                map.put(metaData.getColumnName(i), resultSet.getString(i));

                //list.add(map);
            }
            //System.out.println(map);
            //System.out.println(list);
//            for(Object s:map.keySet()){
//                System.out.println("key : "+s+" value : "+map.get(s));
//               list.add(map);
//            }
            for (Map.Entry<String, String> entry:map.entrySet()){
                list.add(entry.getKey()+" : "+entry.getValue());
            }
        }
        return list;

    }
}
